#include "stdafx.h"

#include "parser_internal.h"
#include "parser_state.h"
#include "parser_errors.h"

#include "ast_namespaces.h"
#include "ast_declarations.h"

namespace funpl
{

namespace parser
{

// Parses the declarations in a namespace.
void maybe_parse_namespace_body(parser_state &state, ast::namespace_ *namespace_)
{
	while (true)
		switch(skip_semicolons(state).token.type)
		{
		case token_type::kw_fun:
			{
				// Function
				auto function = parse_global_function(state, namespace_);
				namespace_->elements.push_back( ast::namespace_::element(function->decl->name, function) );
			}
			break;

		case token_type::kw_struct:
			{
				// Structure
				auto struct_ = parse_struct(state, namespace_);
				namespace_->elements.push_back( ast::namespace_::element(struct_->name, struct_) );
			}
			break;

		case token_type::kw_class:
			{
				// Class
				auto class_ = parse_class(state, namespace_);
				namespace_->elements.push_back( ast::namespace_::element(class_->name, class_) );
			}
			break;

		case token_type::kw_typedef:
			{
				// Typedef
				auto typedef_ = parse_typedef(state, namespace_, false);
				namespace_->elements.push_back( ast::namespace_::element(typedef_->name, typedef_) );
			}
			break;

		case token_type::kw_typegroup:
			{
				// Typegroup
				auto typegroup = parse_typegroup(state, namespace_);
				namespace_->elements.push_back( ast::namespace_::element(typegroup->name, typegroup) );
			}
			break;

		default:
			// Stop on unexpected token
			return;
		}
}

} // namespace

} // namespace